package com.trainbook.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.trainbook.common.result.JsonResult;
import com.trainbook.entity.DTO.AddSiteDTO;
import com.trainbook.entity.DTO.middle.AddSite_Site2site;
import com.trainbook.entity.Site;
import com.trainbook.entity.Site2site;
import com.trainbook.mapper.SiteMapper;
import com.trainbook.service.ISite2siteService;
import com.trainbook.service.ISiteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 * 站点表 服务实现类
 * </p>
 *
 * @author Dempsey
 * @since 2020-11-27
 */
@Service
public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements ISiteService {

    @Autowired
    ISite2siteService site2siteService;

    /**
     * 获取所有站点
     *
     * @return
     */
    @Override
    public JsonResult getAllSites() {
        return JsonResult.result(list());
    }

    /**
     * 添加一个站点
     *
     * @param addSiteDTO 前端传来的一个新增站点的信息，包括站点名，和相连的站点（名和距离）
     * @return
     */
    @Override
    @Transactional
    public JsonResult addSite(AddSiteDTO addSiteDTO) {
        // 检查站点是否已存在
        QueryWrapper<Site> siteQueryWrapper = new QueryWrapper<>();
        siteQueryWrapper.eq("siteName", addSiteDTO.getSiteName());
        if (list(siteQueryWrapper).size() > 0) {
            return JsonResult.error("站点已存在");
        }

        // 先保存一下一个新的站点
        save(Site.builder().siteName(addSiteDTO.getSiteName())
                .longitude(addSiteDTO.getLongitude())
                .latitude(addSiteDTO.getLatitude())
                .build());
        // 取得新存的站点的id
        siteQueryWrapper.eq("siteName", addSiteDTO.getSiteName());
        Integer id = getOne(siteQueryWrapper).getId();

        // 再添加站点关联的表项
        for (AddSite_Site2site addSite_Site2site : addSiteDTO.getAddSite_Site2site()) {
            Site2site site2site = new Site2site();
            site2site.setSiteA(id);
            site2site.setSiteB(addSite_Site2site.getSiteB());
            site2site.setDistance();
            site2site.setRequiredTime(site2site.getRequiredTime());
            site2site.setPrice(addSite_Site2site.getPrice());
            site2siteService.save(site2site);
        }

        return JsonResult.success();
    }

    /**
     * 删除节点
     *
     * @param siteId 节点 id
     * @return
     */
    @Override
    @Transactional
    public JsonResult removeSite(int siteId) {
        // 先将站点移除
        removeById(siteId);
        // 再将该站点有关的站点信息都移除
        // ps:数据库里设置了相关站点的外键策略，这边在确保一下删除（懒得测试）
        QueryWrapper<Site2site> site2siteQueryWrapper = new QueryWrapper<>();
        site2siteQueryWrapper.eq("siteA", siteId).or().eq("siteB", siteId);
        site2siteService.remove(site2siteQueryWrapper);
        return JsonResult.success("删除成功");
    }

}
